home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Systemmonitors / Snoopy / Includes / macro.i next >
Text File  |  1996-09-26  |  12KB  |  655 lines

  1.          IFND    MACRO_I
  2. MACRO_I        equ    1
  3.  
  4. ;--------------    define a pixel size to both BYTE,WORD and LONG sizes
  5. DEFINE        MACRO
  6. \1        equ    \2
  7. \1.B        equ    (\2)/8
  8. \1.W        equ    (\2)/16
  9. \1.L        equ    (\2)/32
  10.         ENDM
  11.  
  12. ;--------------    some standard defines
  13. CSI        equ    $9b        ; 'Control Sequence Indicator'
  14. ESC        equ    $1b        ; 'ANSI ESCape character'
  15. VERTICALTAB    equ    $0b        ; 'VERTICAL TABulator' (Eine Zeile Hoch)
  16. PALID        equ    $FFFFFFDE    ; Anfang Pal-Bildschirm
  17. CENDVALUE    equ    $FFFFFFFE    ; Ende Copperliste (auch Macro cend)
  18.  
  19. ;--------------    all registers mask
  20. ALLREGISTERS    REG    D0-D7/A0-A6
  21.  
  22. ;--------------    standard boolean registers
  23. TRUE         equ    1
  24. FALSE        equ    0
  25.         IFND    NULL
  26. NULL        equ    0
  27.         ENDC
  28.  
  29. ;--------------    push/pop all registers on the stack
  30. PUSHALL        MACRO
  31.         pushm    d0-d7/a0-a6
  32.         ENDM
  33.  
  34. PULLALL        MACRO
  35.         popm    d0-d7/a0-a6
  36.         ENDM
  37.  
  38. ;--------------    call function \1 (optional: load library \2)
  39. ;--------------    NOTE: (to my mind) better than DOSCALL and stuff like that
  40. ;--------------    because a6 is only loaded if necesarry
  41. ;--------------    
  42. CALL        MACRO
  43.         IFEQ    NARG-2
  44.         movea.l    \2,a6
  45.         ENDC
  46.         jsr    (_LVO\1,a6)
  47.         ENDM
  48.  
  49. ;--------------    print \1 using arguments \2 (optional: dosBase = \3)
  50. DPRINTF        MACRO
  51.         pushm    d0-d3/a0-a1/a6
  52.         IFGT    NARG-1
  53.         move.l    #\2,D2
  54.         ELSE
  55.         moveq    #0,d2
  56.         ENDC
  57.         move.l    #\1,d1
  58.         IFGT    NARG-2
  59.         CALL    VPrintf,\3
  60.         ELSE
  61.         CALL    VPrintf,<(dosBase,pc)>
  62.         ENDC
  63.         popm    d0-d3/a0-a1/a6
  64.         ENDM
  65.  
  66. ;--------------    branch to \2 if \1 is uppercase
  67. ;--------------    
  68. IFUCASE        MACRO
  69.         cmpi.b    #'a',\1
  70.         blo\0    \2
  71.         cmpi.b    #'z',\1
  72.         bgt\0    \2
  73.         ENDM
  74.  
  75. ;--------------    make data register \1 uppercase
  76. UCASE        MACRO
  77.         cmpi.b    #'a',\1
  78.         blo.b    .UCASE\@
  79.         cmpi.b    #'z',\1
  80.         bgt.b    .UCASE\@
  81.         subi.b    #('a'-'A'),\1
  82. .UCASE\@    
  83.         ENDM
  84.  
  85. ;--------------    make data register \1 lowercase
  86. LCASE        MACRO
  87.         cmpi.b    #'A',\1
  88.         blo.b    .LCASE\@
  89.         cmpi.b    #'Z',\1
  90.         bgt.b    .LCASE\@
  91.         addi.b    #('a'-'A'),\1
  92. .LCASE\@    
  93.         ENDM
  94.  
  95. ;--------------    branch to \2 if \1 is a digit
  96. IFDIGIT        MACRO
  97.         cmpi.b    #'0',\1
  98.         blo.b    .DIGIT\@
  99.         cmpi.b    #'9',\1
  100.         bgt.b    .DIGIT\@
  101.         bra    \2
  102. .DIGIT\@    
  103.         ENDM
  104.  
  105. ;--------------    move BPTR \1 to APTR \2 (scratches d0)
  106. BMOVE        MACRO
  107.         move.l    \1,d0
  108.         lsl.l    #2,d0
  109.         move.l    d0,\2
  110.         ENDM
  111.  
  112. ;--------------    convert BSTR \1 to ASTR \2 (d0.b is set to the string size)
  113. B2ASTR        MACRO
  114.         IFNC    '\2','a0'
  115.         push    a0
  116.         ENDC
  117.         move.l    \1,d0
  118.         lsl.l    #2,d0
  119.         movea.l    d0,a0
  120.         move.b    (a0)+,d0
  121.         IFNC    '\2',a0
  122.         move.l    a0,\2
  123.         pop    a0
  124.         ENDC
  125.         ENDM
  126.  
  127. ;--------------    some "antique" defines
  128. exec.base    equ    4
  129. execBase    equ    4
  130. customBase    equ    $dff000
  131. custom.chips    equ    $dff000
  132.  
  133. ;--------------    cleanup memory area starting at \1, size=\2
  134. CLEARSECTION    MACRO
  135.         pushm    a0/d0
  136.         lea    \1,a0
  137.         move.l    #(\2)-1,d0
  138. .CLS\@        clr.b    (a0)+
  139.         dbra    d0,.CLS\@
  140.         popm    a0/d0
  141.         ENDM
  142.  
  143. ;--------------    define an AmigaDOS style version string \1
  144. VERSION        MACRO
  145.         db    0,'$VER: \1',0
  146.         even
  147.         ENDM
  148.  
  149. BRF        MACRO
  150.         IFEQ    NARG-3
  151.         tst    \1
  152.         ELSE
  153.         tst\3    \1
  154.         ENDC
  155.         beq\0    \2
  156.         ENDM
  157.  
  158. ;--------------    BRanch\0 to \2 if \1[\3] is TRUE
  159. BRT        MACRO
  160.         IFEQ    NARG-3
  161.         tst    \1
  162.         ELSE
  163.         tst\3    \1
  164.         ENDC
  165.         bne\0    \2
  166.         ENDM
  167.  
  168. ;--------------    BRanch\0 to \1 on Low Bit Clear in \2
  169. BRLBC        MACRO
  170.         btst    #0,\1
  171.         beq\0    \2
  172.         ENDM    
  173.  
  174. ;--------------    BRanch\0 to \1 on Low Bit Set in \2
  175. BRLBS        MACRO
  176.         btst    #0,\1
  177.         bne\0    \2
  178.         ENDM
  179.  
  180. ;--------------    BRanch\0 to \1 on Bit \1 Set in \2
  181. BRBS        MACRO
  182.         btst    \1,\2
  183.         bne\0    \3
  184.         ENDM
  185.  
  186. ;--------------    BRanch\0 to \1 on Bit \1 Clear in \2
  187. BRBC        MACRO
  188.         btst    \1,\2
  189.         beq\0    \3
  190.         ENDM
  191.  
  192. ;--------------    compare <ea>-values \1,\2 size=\0 ; scratches d0 or \3
  193. COMPARE        MACRO
  194.         IFEQ    NARG-3
  195.         move\0    \1,\3
  196.         cmp\0    \2,\3
  197.         ELSE
  198.         move\0    \1,d0
  199.         cmp\0    \2,d0
  200.         ENDC
  201.         ENDM
  202.  
  203. ;--------------    
  204. ;--------------    branch to \4 if \1 matches \3 any comparison
  205. ;-------------- possible comparisons are ==, !=, <, <=, >, >=
  206. BRANCH        MACRO    ; \1=Wert 1,\2=Condition Code,\3=Wert 2,\4=Label,[\5=Größe Vergleich]
  207.         IFEQ    NARG-5
  208.         COMPARE\5 \1,\3
  209.         ELSE
  210.         COMPARE    \1,\3
  211.         ENDC
  212.         IFC    '\2','=='
  213.         beq\0    \4
  214.         ENDC
  215.         IFC    '\2','!='
  216.         bne\0    \4
  217.         ENDC
  218.         IFC    '\2','<='
  219.         bls\0    \4
  220.         ENDC
  221.         IFC    '\2','<'
  222.         blo\0    \4
  223.         ENDC
  224.         IFC    '\2','>='
  225.         bhs\0    \4
  226.         ENDC
  227.         IFC    '\2','>'
  228.         bhi\0    \4
  229.         ENDC
  230.         ENDM
  231.  
  232. ;--------------    openlib \1 and put the base to \2 (version \3)
  233. OPENLIB        MACRO
  234.         lea    \1,a1
  235.         IFEQ    NARG-3
  236.         moveq    #\3,d0
  237.         ELSE
  238.         moveq    #0,d0
  239.         ENDC
  240.         CALL    OpenLibrary,<(execBase).w>
  241.         move.l    d0,\2
  242.         tst.l    d0
  243.         ENDM
  244.  
  245. ;--------------    "save" closing of library \1
  246. CLOSELIB    MACRO
  247.         tst.l    \1
  248.         beq.b    .Closelib\@
  249.         movea.l    \1,a1
  250.         CALL    CloseLibrary,<(execBase).w>
  251. .Closelib\@    
  252.         ENDM
  253.  
  254. ;--------------    clear stack memory sized \1 in stack register \2
  255. CLEARSTACK    MACRO
  256.         movem.l    d0/\2,-(sp)
  257.         move.w    #(\1)/2-1,d0
  258. .CLRSTK\@    move.w    #0,(\2)+
  259.         dbra    d0,.CLRSTK\@
  260.         movem.l    (sp)+,d0/\2
  261.         ENDM
  262.  
  263. ;--------------    create stack sized \1 in stack register \2
  264. ;--------------    NOTE: this stack has positive offsets, which means you 
  265. ;--------------    can directly access it with STRUCTURE macros
  266. CREATESTACK    MACRO
  267.         link    \2,#-\1
  268.         subi.l    #\1,\2
  269.         CLEARSTACK \1,\2
  270.         ENDM
  271.  
  272. ;--------------    remove local stack sized \1 in stack register \2
  273. ENDSTACK    MACRO
  274.         addi.l    #\1,\2
  275.         unlk    \2
  276.         ENDM
  277.  
  278. ;--------------    minimal function head for function \1 using register mask \2
  279. ;--------------    you *MUST* use DONE (or ENDSUB) to end this function;
  280. ;--------------    else the assembler will give you a warning
  281. XENTRY        MACRO
  282.         IFEQ    NARG-2            ; Wenn es 2 Argumente gibt
  283. \1_regs        reg    \2            ; Register sichern
  284. \1        movem.l    \1_regs,-(sp)        ; Register auf den Stack
  285.         ELSE                ; Sonst
  286. \1                        ; Nur den Funktionsnamen definieren    
  287.         ENDC                ; Ende
  288. ENTRYohneDONEfür    set    \1_done    
  289.         ENDM
  290.  
  291. ;--------------    all-purpose function entry macro. Defines function named \1 
  292. ;--------------    saving the registers \2. Optional: stacksize \3, stackregister \4
  293. ;--------------    you *MUST* use DONE (or ENDSUB) to end this function;
  294. ;--------------    else the assembler will give you a warning
  295. ENTRY        MACRO
  296.         IFD    IS_LINKABLE
  297.         xdef    \1
  298.         ENDC    
  299.         XENTRY    \1,\2
  300.         IFEQ    NARG-4
  301. \1_stksize    equ    \3
  302. \1_stkreg    equr    \4
  303.         CREATESTACK \3,\4
  304.         ENDC
  305.         ENDM
  306.  
  307. ;--------------    end a function created with ENTRY or XENTRY macros;
  308. ;--------------    it cleans up the stack (if one exists) and restores the
  309. ;--------------    saved register list
  310. ENDSUB        MACRO
  311.         IFNC    '','\1'
  312.         IFND    \1
  313.         FAIL    Die Funktion \1 existiert nicht
  314.         ENDC
  315.         IFND    \1_done
  316. \1_done        
  317.         ENDC
  318.         ELSE
  319. .function_done
  320.         ENDC
  321.         IFD    \1_stksize
  322.         ENDSTACK \1_stksize,\1_stkreg
  323.         ENDC
  324.         IFD    \1_regs
  325.         movem.l    (sp)+,\1_regs
  326.         ENDC
  327.         ENDM
  328.  
  329. ;--------------    same as ENDSUB but returns with RTS
  330. DONE        MACRO
  331.         ENDSUB    \1
  332.         rts
  333.         ENDM
  334.  
  335. ;--------------    same as ENDSUB but returns with RTE
  336. DONEEXCEPTION    MACRO
  337.         ENDSUB    \1
  338.         rte
  339.         ENDM
  340.  
  341. ;--------------    don't use this: internal DEBUG macro
  342. DEBUGALLOWED    MACRO
  343.         IFD    DEBUG_MODE
  344. __DEBUG_VAR    
  345.         IFC    '\1',''
  346.         DC.L    $7F000
  347.         ELSE
  348.         DC.L    \1
  349.         ENDC
  350.         ENDC
  351.         ENDM    
  352.  
  353. DEBUG        MACRO
  354.         IFD    DEBUG_MODE
  355.         move.l    a0,-(sp)
  356.         move.l    \1,-(sp)
  357.         movea.l    (__DEBUG_VAR),a0
  358.         move.l    (sp)+,(a0)+
  359.         IFGT    NARG-1
  360.         move.l    \2,(a0)+
  361.         ENDC    
  362.         IFGT    NARG-2
  363.         move.l    \3,(a0)+
  364.         ENDC    
  365.         IFGT    NARG-3
  366.         move.l    \4,(a0)+
  367.         ENDC    
  368.         IFGT    NARG-4
  369.         move.l    \5,(a0)+
  370.         ENDC    
  371.         IFGT    NARG-5
  372.         move.l    \6,(a0)+
  373.         ENDC    
  374.         move.l    a0,(__DEBUG_VAR)
  375.         move.l    (sp)+,a0
  376.         ENDC
  377.         ENDM
  378.  
  379. ;--------------    set or clear flag \3 if \1 matches \2 using comparison \3
  380. SETFLAG        MACRO
  381.         COMPARE\0 \1,\3
  382.         IFC    '\2','=='
  383.         seq    \4
  384.         ENDC
  385.         IFC    '\2','!='
  386.         sne    \4
  387.         ENDC
  388.         IFC    '\2','<='
  389.         sls    \4
  390.         ENDC
  391.         IFC    '\2','<'
  392.         slo    \4
  393.         ENDC
  394.         IFC    '\2','>='
  395.         sge    \4
  396.         ENDC
  397.         IFC    '\2','>'
  398.         sgt    \4
  399.         ENDC
  400.         ENDM
  401.  
  402. ;--------------    BROKEN::::::::::::::::::::::::::::::::::::::::::::::::
  403. IIF        MACRO    ;\1=ConditionCode,\2=Befehle
  404. IIF_FLAG    SET    0
  405.         IFC    '\1','EQ'
  406. IIF_FLAG    SET    1
  407.         bne.b    .iif\@
  408.         ENDC
  409.         IFC    '\1','NE'
  410. IIF_FLAG    SET    1
  411.         beq.b    .iif\@
  412.         ENDC
  413.         IFC    '\1','LS'
  414. IIF_FLAG    SET    1
  415.         bgt.b    .iif\@
  416.         ENDC
  417.         IFC    '\1','LO'
  418. IIF_FLAG    SET    1
  419.         bge.b    .iif\@
  420.         ENDC
  421.         IFC    '\1','HS'
  422. IIF_FLAG    SET    1
  423.         blo.b    .iif\@
  424.         ENDC
  425.         IFC    '\1','HI'
  426. IIF_FLAG    SET    1
  427.         bls.b    .iif\@
  428.         ENDC
  429.         IFNE    IIF_FLAG-1
  430.         FAIL     Ungültiger Conditioncode '\1' für IIF-Makro
  431.         ENDC
  432. \2
  433.         IFEQ    NARG-3
  434.         bra.b    .else\@
  435. .iif\@
  436. \3        **** BROKEN, DON'T USE ****
  437. .else\@
  438.         ELSE
  439. .iif\@
  440.         ENDC
  441.         ENDM
  442.  
  443. ;--------------    optimized clear for data registers
  444. CLEAR_DATAREG    MACRO
  445.         IFC    \*UPPER(\0),.L
  446.         moveq    #0,\1
  447.         ELSE
  448.         clr\0    \1
  449.         ENDC
  450.         ENDM
  451.  
  452. ;--------------    optimized clear for addr registers
  453. CLEAR_ADDRREG    MACRO
  454.         IFC    \*UPPER(\0),.B
  455.         clr.b    \1,\1
  456.         ELSE
  457.         suba\0    \1,\1
  458.         ENDC
  459.         ENDM
  460.  
  461. ;--------------    clear Dx/Ax/anything else
  462. CLEAR_ANYTHING    MACRO
  463.         IFNC    '','\1'
  464.         IFEQ    \*STRLEN(\1)-3
  465.         IFC    \*UPPER(\*LEFT(\1,1)),D
  466.         CLEAR_DATAREG\0    \1        
  467.         MEXIT
  468.         ENDC
  469.         IFC    \*UPPER(\*LEFT(\1,1)),A
  470.         CLEAR_ADDRREG\0    \1
  471.         MEXIT
  472.         ENDC
  473.         ENDC
  474.         clr\0    \1
  475.         ENDC
  476.         ENDM
  477.  
  478. ;--------------    optimized clear [up to 16 arguments]
  479. OPTIMIZED_CLEAR    MACRO
  480.         CLEAR_ANYTHING\0 \1
  481.         CLEAR_ANYTHING\0 \2
  482.         CLEAR_ANYTHING\0 \3
  483.         CLEAR_ANYTHING\0 \4
  484.         CLEAR_ANYTHING\0 \5
  485.         CLEAR_ANYTHING\0 \6
  486.         CLEAR_ANYTHING\0 \7
  487.         CLEAR_ANYTHING\0 \8
  488.         CLEAR_ANYTHING\0 \9
  489.         CLEAR_ANYTHING\0 \(10)
  490.         CLEAR_ANYTHING\0 \(11)
  491.         CLEAR_ANYTHING\0 \(12)
  492.         CLEAR_ANYTHING\0 \(13)
  493.         CLEAR_ANYTHING\0 \(14)
  494.         CLEAR_ANYTHING\0 \(15)
  495.         CLEAR_ANYTHING\0 \(16)
  496.         ENDM
  497.  
  498. ;--------------    required, because in exec/macros.i another 'CLEAR' is defined
  499. CLEAR        SETMAC    OPTIMIZED_CLEAR
  500.  
  501. ;--------------    exchange two variables using stack (don't use stack relative args)
  502. XCHG        MACRO    ;Op1,Op2
  503.         IFC    \*UPPER(\0),.B
  504.         move.w    d0,-(sp)
  505.         move.b    \1,d0
  506.         move.b    \2,\1
  507.         move.b    d0,\2
  508.         move.w    (sp)+,d0
  509.         ELSE
  510.         move\0    \1,-(sp)
  511.         move\0    \2,\1
  512.         move\0    (sp)+,\2
  513.         ENDC
  514.         ENDM
  515.  
  516. ;--------------    same as ++/-- in C
  517. INC        MACRO
  518.         addq\0    #1,\1
  519.         ENDM
  520. DEC        MACRO
  521.         subq\0    #1,\1
  522.         ENDM
  523.  
  524. ;--------------    index calculation for an 2 dimensional array. BROKEN
  525. ;--------------    
  526. ;--------------    INDEX \1=result,\2=x,\3=xsize,\4=xmin,[\5=xmax,\6=y,\7=ysize,\8=ymin]
  527. ;--------------    
  528. ;--------------    Dabei ist 
  529. ;--------------    
  530. ;--------------      x/y : Die Elementnummer
  531. ;--------------      xsize/ysize : Die Größe eines Elements dieses Typs
  532. ;--------------      xmin/ymin : Der Minimalwert für das Element
  533. ;--------------      xmax/ymax : Der Maximalwert für das Element
  534. ;--------------    
  535. ;--------------    Eine eindimensionale Liste ist dabei So aufgebaut
  536. ;--------------    
  537. ;--------------    [ Element=0, index=xmin,     ,offset=0]
  538. ;--------------    [ Element=1, index=xmin+xsize    ,offset=xsize]
  539. ;--------------    [ Element=2, index=xmin+2*xsize    ,offset=2*xsize]
  540. ;--------------     ...
  541. ;--------------    
  542. ;--------------    Eine zweidimensionale Liste ist dabei so aufgebaut
  543. ;--------------    
  544. ;--------------    [ Element=0/0, index=xmin,        ,offset=0]
  545. ;--------------    [ Element=0/1, index=xmin+xsize        ,offset=xsize]
  546. ;--------------    [ Element=0/2, index=xmax+2*xsize    ,offset=2*xsize]
  547. ;--------------     ...
  548. ;--------------    [ Element=1/0, index=xmin+(xmin-xmax)*xsize ,offset=(xmin-xmax)*xsize]
  549. ;--------------     ...
  550. ;--------------    
  551. INDEX        MACRO
  552.         move.l    #((\2)-(\4))*(\3),\1    ; Result = X-Offset
  553.         ENDM
  554.  
  555. ;--------------    Verschiedene direkte 'Branch on Condition'-Befehle, die nicht wie
  556. ;--------------    'BRANCH' extra-komische Vergleiche anstellen müßen.
  557. BRNE        MACRO
  558.         cmp\4    \1,\2
  559.         bne\0    \3
  560.         ENDM
  561.  
  562. BREQ        MACRO
  563.         cmp\4    \1,\2
  564.         beq\0    \3
  565.         ENDM
  566.  
  567. BRLO        MACRO
  568.         cmp\4    \1,\2
  569.         blo\0    \3
  570.         ENDM
  571.  
  572. BRLS        MACRO
  573.         cmp\4    \1,\2
  574.         bls\0    \3
  575.         ENDM
  576.  
  577. BRGT        MACRO
  578.         cmp\4    \1,\2
  579.         bgt\0    \3
  580.         ENDM
  581.  
  582. BRGE        MACRO
  583.         cmp\4    \1,\2
  584.         bge\0    \3
  585.         ENDM
  586.  
  587. BREQ0        MACRO
  588.         tst\3    \1
  589.         beq\0    \2
  590.         ENDM
  591.  
  592. BRNE0        MACRO
  593.         tst\3    \1
  594.         bne\0    \2
  595.         ENDM
  596.  
  597. ADDO        MACRO
  598.         IFC    \*LEFT(\1,1),#
  599.         IFLE    \*RIGHT(\1,\*STRLEN(\1)-1)-8
  600.         addq\0    \1,\2
  601.         ELSE
  602.         addi\0    \1,\2
  603.         ENDC
  604.         ELSE
  605.         add\0    \1,\2
  606.         ENDC
  607.         ENDM
  608.  
  609. SUBO        MACRO
  610.         IFC    \*LEFT(\1,1),#
  611.         IFLE    \*RIGHT(\1,\*STRLEN(\1)-1)-8
  612.         subq\0    \1,\2
  613.         ELSE
  614.         subi\0    \1,\2
  615.         ENDC
  616.         ELSE
  617.         sub\0    \1,\2
  618.         ENDC
  619.         ENDM
  620.  
  621. ;--------------    copy string \1 to string \2 (both arguments Ax)
  622. STRCPY        MACRO    ; sourcereg, targetreg
  623. .strcpy\@    move.b    (\1)+,(\2)+
  624.         bne.s    .strcpy\@
  625.         ENDM
  626.  
  627. ;--------------    cpu status bits
  628.         BITDEF    CPUSTATE,EXTENDED,4    ; X
  629.         BITDEF    CPUSTATE,NEGATIVE,3    ; N
  630.         BITDEF    CPUSTATE,ZERO,2        ; Z
  631.         BITDEF    CPUSTATE,OVERFLOW,1    ; V
  632.         BITDEF    CPUSTATE,CARRY,0    ; C
  633.  
  634.  
  635. ;--------------    my REMHEAD macro. Only difference to exec/list.i : uses local
  636. ;--------------    labels
  637. MYREMHEAD    MACRO    ; A0-list A1-(destroyed) D0=node
  638.         MOVE.L    (A0),A1
  639.         MOVE.L    (A1),D0
  640.         BEQ.B    .REMHEAD\@
  641.         MOVE.L    D0,(A0)
  642.         EXG.L    D0,A1
  643.         MOVE.L    A0,LN_PRED(A1)
  644. .REMHEAD\@
  645.         ENDM
  646.  
  647. ;--------------    define an intuition-style alert()
  648. DEFINE_ALERT    MACRO
  649.         dc.w    10
  650.         dc.b    15,'\1',0,0
  651.         ENDM
  652.  
  653.         ENDC
  654. ;--------------    
  655.